package com.javasm.mingming.login.controller;

import com.javasm.mingming.common.R;
import com.javasm.mingming.common.exception.JavasmException;
import com.javasm.mingming.common.exception.JavasmExceptionEnum;
import com.javasm.mingming.common.utils.TokenUtil;
import com.javasm.mingming.login.service.LoginService;
import com.javasm.mingming.webuser.entity.WebUser;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

/**
 * @author javasm
 * @version 0.1
 * @className LoginController
 * @descriptioin:
 * @date 2025/1/6 14:48
 * @since jdk11
 */
@RestController
@RequestMapping("/login")
public class LoginController {

    @Resource
    LoginService loginService;

    //根据 页面的已知参数(能提供的参数)写接口,根据页面需要的数据,决定返回值
    //写接口,很难一次性成功,肯定是多次修改完善才可以,在经验不足的情况下,非常容易遗漏需求,不用担心,后续补上就可以了
    @PostMapping("/doUnameLogin")
    public R doUsernamePasswordLogin(String username,String password){
        if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)){
            throw new JavasmException(JavasmExceptionEnum.ParameterNull);
        }
        //不会去思考具体如何实现需求.只思考,这个interface 应该 给我什么,我能给他什么
        //不要一次性的把所有的需求,所有的步骤都想完整,因为大脑内存不足
        WebUser webUser = loginService.doUnameLogin(username,password);
        //登录成功 返回用户信息
        return R.ok(webUser);
    }

    @Resource
    HttpServletRequest request;

    @PostMapping("/doUnameTokenLogin")
    public ResponseEntity<R> doUnamePwdTokenLogin(String username, String password){
        /**
         * 如果,用户传入了 用户名密码,按照用户名密码登录
         * 登录成功之后,生成token,返回
         * 如果用户没有传用户名和密码,检查token
         * 如果token有数据,返回用户信息,如果token没有数据,异常
         * 如果 token,用户名密码,都是空,异常
         */
        WebUser webUser = null;
        if (!StringUtils.isEmpty(username)&&!StringUtils.isEmpty(password)){
            //传了用户名和密码
            webUser = loginService.doUnameLogin(username,password);
            //生成token信息
            /*if (webUser != null && webUser.getUid() != null){
                String uid = webUser.getUid().toString();
                String token = TokenUtil.generateToken(uid);
                //token不会跟随body返回,放到head里面
                HttpHeaders httpHeaders = new HttpHeaders();
                //把token 存入 头信息
                httpHeaders.add(TokenUtil.Server_Token_Key,token);
                //默认情况下,浏览器的js中,只会处理系统自带的header属性,自定义的属性是无法通过js获取的
                //需要设置一下,特殊处理的属性是哪个
                httpHeaders.add("Access-Control-Expose-Headers",TokenUtil.Server_Token_Key);
                return new ResponseEntity<>(R.ok(webUser),httpHeaders, HttpStatus.OK);
            }*/
        }else {
            //前端传入的token
            String clientToken = request.getHeader(TokenUtil.Server_Token_Key);
            if (StringUtils.isEmpty(clientToken)){
                //token是空,用户名或密码是空,抛出参数异常
                throw new JavasmException(JavasmExceptionEnum.ParameterNull);
            }else {
                //至少是有token字符串的
                String uid = TokenUtil.parse(clientToken);
                webUser = loginService.queryByUid(uid);
                /*//每一次,登录成功,都要生成新的token,返回客户端
                String token = TokenUtil.generateToken(uid);
                //token不会跟随body返回,放到head里面
                HttpHeaders httpHeaders = new HttpHeaders();
                //把token 存入 头信息
                httpHeaders.add(TokenUtil.Server_Token_Key,token);
                //默认情况下,浏览器的js中,只会处理系统自带的header属性,自定义的属性是无法通过js获取的
                //需要设置一下,特殊处理的属性是哪个
                httpHeaders.add("Access-Control-Expose-Headers",TokenUtil.Server_Token_Key);
                return new ResponseEntity<>(R.ok(webUser),httpHeaders, HttpStatus.OK);*/
            }
        }
        if (webUser != null && webUser.getUid() != null){
            String uid = webUser.getUid().toString();
            String token = TokenUtil.generateToken(uid);
            //token不会跟随body返回,放到head里面
            HttpHeaders httpHeaders = new HttpHeaders();
            //把token 存入 头信息
            httpHeaders.add(TokenUtil.Server_Token_Key,token);
            //默认情况下,浏览器的js中,只会处理系统自带的header属性,自定义的属性是无法通过js获取的
            //需要设置一下,特殊处理的属性是哪个
            httpHeaders.add("Access-Control-Expose-Headers",TokenUtil.Server_Token_Key);
            return new ResponseEntity<>(R.ok(webUser),httpHeaders, HttpStatus.OK);
        }

        return ResponseEntity.ok(R.ok());
    }

    //注册
    @PostMapping("/doReg")
    public R doRegister(@RequestBody WebUser webUser){
        if (webUser == null){
            throw new JavasmException(JavasmExceptionEnum.ParameterNull);
        }
        loginService.doRegister(webUser);
        return R.ok(webUser);
    }

    //找回密码接口
    @GetMapping("/back/password")
    public R backPassword(String mail){
        loginService.backPassword(mail);
        return R.ok();
    }

    @GetMapping("/check/email")
    public R checkEmailToken(String token){
        String uidToken = loginService.checkToken(token);
        return R.ok(uidToken);
    }

    @PostMapping("/update/password")
    public R updatePassword(String token,String password){
        loginService.updatePassword(token,password);
        return R.ok();
    }
}
